package CreatorPattern.Prototype;

/**
 * @author: Themberfue
 * @date: 2025/8/10 11:27
 * @description:
 */
import java.util.ArrayList;
import java.util.List;

// 1. 原型接口（声明克隆方法）
interface Prototype<T> {
    T clone();
}

// 2. 具体原型类 - 简历
class Resume implements Prototype<Resume> {
    private String name;
    private String position;
    private List<String> experiences; // 引用类型成员

    public Resume(String name) {
        this.name = name;
        this.experiences = new ArrayList<>();
    }

    // 设置职位
    public void setPosition(String position) {
        this.position = position;
    }

    // 添加工作经验
    public void addExperience(String experience) {
        experiences.add(experience);
    }

    // 浅克隆实现
    @Override
    public Resume clone() {
        try {
            // 浅克隆：基本类型复制，引用类型仅复制引用
            Resume clone = (Resume) super.clone();
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

    // 深克隆实现
    public Resume deepClone() {
        try {
            Resume clone = (Resume) super.clone();
            // 深克隆：对引用类型也进行克隆
            clone.experiences = new ArrayList<>(this.experiences);
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

    // 打印简历信息
    public void print() {
        System.out.println("姓名: " + name);
        System.out.println("应聘职位: " + position);
        System.out.println("工作经验:");
        for (String exp : experiences) {
            System.out.println("- " + exp);
        }
        System.out.println("---------------------");
    }
}

// 3. 客户端代码
public class PrototypeExample {
    public static void main(String[] args) {
        // 创建原始简历
        Resume original = new Resume("张三");
        original.setPosition("软件工程师");
        original.addExperience("2020-2023 某科技公司 开发工程师");
        original.addExperience("熟练掌握Java、设计模式");

        System.out.println("=== 原始简历 ===");
        original.print();

        // 浅克隆简历并修改
        Resume shallowClone = original.clone();
        shallowClone.setPosition("高级软件工程师");
        shallowClone.addExperience("新增：参与过大型项目架构设计"); // 会影响原始对象的experiences

        System.out.println("=== 浅克隆修改后 - 原始简历 ===");
        original.print(); // 注意原始简历的经验也被修改了

        System.out.println("=== 浅克隆修改后 - 克隆简历 ===");
        shallowClone.print();

        // 深克隆简历并修改
        Resume deepClone = original.deepClone();
        deepClone.setPosition("技术经理");
        deepClone.addExperience("新增：5年团队管理经验"); // 不会影响原始对象

        System.out.println("=== 深克隆修改后 - 原始简历 ===");
        original.print(); // 原始简历不受影响

        System.out.println("=== 深克隆修改后 - 克隆简历 ===");
        deepClone.print();
    }
}

